package base.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo2 {

    public static void main(String[] args) {
        functionDemo_1();
        System.out.println("------------2------------");
        functionDemo_2();
        System.out.println("---------3---------------");
        functionDemo_3();
        System.out.println("----------4--------------");
        functionDemo_4();
        System.out.println("------------5------------");
        functionDemo_5();
        System.out.println("-----------6-------------");
        functionDemo_6();
        System.out.println("--------7----------------");
        functionDemo_7();
    }

    /**
     * 正则表达式对字符串的常见操作
     * 1. 匹配
     *      其实使用的就是String类中的matches方法。
     *
     * 2. 切割
     *      其实使用的就是String类中的split方法。
     * 3. 替换
     *
     * 4. 获取
     */


    /*
     * 演示匹配
     */
    public static void functionDemo_1() {
        //匹配手机号码是否正确
        String tel = "15800001111";
        String regex = "1[358]\\d{9}";          //1开头，[358] 第二位, 后面9个 \d
        boolean b = tel.matches(regex);
        System.out.println(tel + ":" + b);      //15800001111:true
    }

    /*
     * 演示切割
     */
    public static void functionDemo_2() {
        String str = "zhangsan  xiaoqiang     zhaoliu";
        String[] names = str.split(" +");
        for (String name : names) {
            System.out.println(name);
        }
    }

    public static void functionDemo_3() {
        String str = "zhangsan.xiaoqiang.zhaoliu";
        String[] names = str.split("\\.");
        for (String name : names) {
            System.out.println(name);
        }
    }

    /*
     * 演示替换
     */
    public static void functionDemo_5() {
        String str = "zhangsanttttxiaoqiangmmmmmzhaoliu";
        //$表示前一个参数的第一组
        str = str.replaceAll("(.)\\1+", "$1");
        System.out.println(str);
    }

    public static void functionDemo_6() {
        String str = "15800001111";
        // 替换中间4个 \d 
        str = str.replaceAll("(\\d{3})(\\d{4})(\\d{4})", "$1****$2");
        System.out.println(str);
    }

    /*
      * 演示获取
      * 将正则规则进行对象的封装。
      * Pattern p = Pattern.compile("a*b");
      * 通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher。
      * boolean b = m.matches();
      */
    public static void functionDemo_7() {
        String str = "da jia hao,ming tian bu fang jia";
        // \\b表示单词边界
        String regex = "\\b[a-z]{3}\\b";
        //1. 将正则封装成对象
        Pattern p = Pattern.compile(regex);
        //2. 通过正则对象获取匹配器对象
        Matcher m = p.matcher(str);
        //使用Matcher对象的方法对字符串进行操作。
        //既然要获取三个字母组成的单词。
        //查找：find();
        while (m.find()) {
            System.out.println(m.group());//获取匹配的子序列
            System.out.println(m.start() + ":" + m.end());
        }
    }


    /*
     * 在表达式 ((A)(B(C))) 中，存在四个这样的组：
     * 1 ((A)(B(C)))
     * 2 \A
     * 3 (B(C))
     * 4 (C)
     * 组零始终代表整个表达式。
     */
    public static void functionDemo_4() {
        String str = "zhangsanttttxiaoqiangmmmmmzhaoliu";
        //(.)表示一组，\\1+表示与第1组相同的出现1次以上
        String[] names = str.split("(.)\\1+");
        for (String name : names) {
            System.out.println(name);
        }
    }


}
